/**
 * 通过数组建造树形结构
 * @param array        {Array}  树形结构平面数组
 * @param id_key       {String} 树形 ID键名
 * @param parentId_key {String} 树形 父级ID 键名
 * @param isRoot     {Function} 回调函数，调用者需要实现该函数，函数结果应为 Boolean 类型
 *        回调时会将从数组中遍历的当前对象与该对象的父级对象一并返回
 *        调用者需要 return 当前对象是否是根节点
 * @return {[{}]} 树形结构
 */
export function buildTree(array, id_key, parentId_key, isRoot) {
  if (!array) return tree;
  let idsObj = {},
    tree = [];
  array.forEach((item) => (idsObj[item[id_key]] = item));
  Object.values(idsObj).forEach((item) => {
    let parentId = item[parentId_key],
      parent = idsObj[parentId];
    if (!isRoot(item, parent)) {
      !parent.children && (parent.children = []);
      let children = parent.children;
      !children.includes(item) && children.push(item);
    } else {
      tree.push(item);
    }
  });
  return tree;
}
